
"""
这个模板提供了一个更标准化和灵活的输出结构,使其输出更加标准化,包含成功状态、错误信息和其他可能需要的输出,
可以轻松地扩展以包含更多信息, 可以根据具体需求修改data和metadata字段的内容。

1. 返回值类型: 函数现在返回一个字典,包含操作结果的各个方面。

2. 输出结构:
   - 'success': bool类型,表示操作是否成功。默认为False,成功时设为True。
   - 'error': str类型,包含错误信息。默认为空字符串,发生错误时填充。
   - 'data': Any类型,可以包含任何额外的数据或结果。默认为None。
   - 'metadata': Dict[str, Any]类型,可以包含关于操作的额外元数据。默认为空字典。

3. 错误处理: 使用try-except块来捕获可能发生的异常,并在发生错误时填充error字段。

4. 类型提示: 使用Python的类型提示来明确参数和返回值的类型。

5. 文档字符串: 更新了函数的文档字符串,包含了返回值结构的详细说明。

6. 示例用法: 在函数定义后添加了一个使用示例。


"""


import os
import sys
import argparse
import json
from typing import Dict, Any, Union
from pathlib import Path
from abc import ABC, abstractmethod

import shutil
import random
import string




def random_string(length=10):
    """生成指定长度的随机字符串"""
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length))





def copy_to_tmp_file(input_filepath):
    # 获取原始文件的扩展名
    _, ext = os.path.splitext(input_filepath)
    #
    temp_dir =  os.getcwd()
    #
    # 创建临时文件
    temp_filename = random_string() + ext
    temp_filepath = os.path.join(temp_dir, temp_filename)
    #
    try:
        # 复制文件到临时位置
        shutil.copy2(input_filepath, temp_filepath)
        print(f"文件已复制到临时位置: {temp_filepath}")
        #
        # 处理临时文件
        #
        return temp_filepath
    except IOError as e:
        print(f"处理文件时发生错误: {e}")
    return None





class FileProcessor(ABC):
    temp_filepath  = None
    def __init__(self, input_filepath: str, output_filepath: str, options: Dict[str, Any] = {}):
        self.input_filepath = input_filepath
        self.output_filepath = output_filepath
        self.options = options

    def has_whitespace(self, string):
        # "检测字符串里是否有空格" string = "Hello\t  World"
        return any(char.isspace() for char in string)


    def copy2tmp(self,input_filepath):
        # 创建临时文件
        self.temp_filepath = copy_to_tmp_file(input_filepath)
        return self.temp_filepath
    def remove_file(self, temp_filepath = None  ):
        filepath = temp_filepath or self.temp_filepath
        if filepath is None :
            return
        if os.path.exists(filepath):
            os.remove(filepath)
            #print(f"临时文件已删除: {filepath}")


    def process(self) -> Dict[str, Union[bool, str, Any]]:
        result = {
            'success': False,
            'error': '',
            'data': None,
            'metadata': {}
        }

        try:
            self._validate_input()
            self._create_output_dir()
            self._process_file()

            result['success'] = True
            result['data'] = "File processed successfully"
            result['metadata'].update({
                'input_filepath': self.input_filepath,
                'output_filepath': self.output_filepath,
            })

        except Exception as e:
            result['error'] = str(e)
            result['metadata']['error_type'] = type(e).__name__

        return result

    def _validate_input(self):
        if not os.path.exists(self.input_filepath):
            raise FileNotFoundError(f"Input file not found 找不到此文件: {self.input_filepath}")

    def _create_output_dir(self):
        output_dir = os.path.dirname(self.output_filepath)
        if output_dir and not os.path.exists(output_dir):
            os.makedirs(output_dir)

    @abstractmethod
    def _process_file(self):
        # 处理的例子
        pass

    @classmethod
    def main(cls):
        parser = argparse.ArgumentParser(description=f"Process files using {cls.__name__}.")
        parser.add_argument("-i", "--input", default="input.txt", help="Path to the input file")
        parser.add_argument("-o", "--output", default="output/processed.txt", help="Path to the output file")
        args = parser.parse_args()

        processor = cls(args.input, args.output)
        result = processor.process()
        print('测试结果',json.dumps(result, indent=2))







#


#from file_processor import FileProcessor

class DemoProcessor(FileProcessor):
    def _process_file(self):
        pandoc_options = self.options.get('pandoc_options', [
            '-f', 'html',
            '-t', 'markdown_strict+pipe_tables+table_captions+yaml_metadata_block'
        ])

        # 在这里可以添加自定义的 HTML 处理逻辑
        # 例如：调整标题级别，处理特定的样式等

        # 将处理后的 HTML 转换为 Markdown
        print('正在处理')

#if __name__ == "__main__":
#    DemoProcessor.main()



def  test(arg={}):
    # Usage example
    processor = DemoProcessor("input.html", "output/converted.md")
    result = processor.process()
    print(result)





if __name__ == "__main__":
    #FileProcessor.main()
    DemoProcessor.main()


#


# python3  script_name.py -i input.html -o output/converted.md
# python3  script_name.py -i input.html -o output/converted.md




#
